package ec.gob.magap.era.dao.impl;

import java.math.BigDecimal;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import ec.gob.magap.era.dao.interfaces.CatalogoDao;
import ec.gob.magap.era.entidades.Resultado;
import ec.gob.magap.era.entities.Canton;
import ec.gob.magap.era.entities.Catalogo;
import ec.gob.magap.era.entities.Provincia;
import ec.gob.magap.era.entities.Region;
import ec.gob.magap.era.entities.Tipocatalogo;
import ec.gob.magap.era.general.HibernateUtil;

public class CatalogoDaoImpl implements CatalogoDao {

	@SuppressWarnings("unchecked")
	@Override
	public List<Catalogo> ConsultarCatalogo(int idTipoCatalogo)
			throws HibernateException {
		
		List<Catalogo> lista = null;
		try{
			Session session=HibernateUtil.getSessionFactory().openSession();

			session.beginTransaction();
			Query query = session.createQuery("from Catalogo where idTipo  = :idTipoCatalogo and estado = 'ACTIVO' ");
	        query.setParameter("idTipoCatalogo", idTipoCatalogo);
	         
	        lista = query.list(); 
	            
			session.getTransaction().commit();
			
			return lista;
		}catch(HibernateException e){
			throw(e);
		}
	}

	@Override
	public Resultado GuardarCatalogo(Catalogo catalogo, String operacion)
			throws HibernateException {
		
		Resultado resultado = new Resultado();
				try{
			
			Session session=HibernateUtil.getSessionFactory().openSession();

			session.beginTransaction();
			
	

			if (operacion == "Modificar" ){
				
				String hql = "update Catalogo set descripcion = :descripcion where id = :id";
		        Query query = session.createQuery(hql);
		        query.setParameter("descripcion",catalogo.getDescripcion());
		        query.setParameter("id",catalogo.getId());
		        query.executeUpdate();


				
				
				resultado.setMensaje("El registro se ha modificado con éxito");
			}
			if (operacion == "Eliminar"){
				
				String hql = "update Catalogo set estado = :estado where id = :id";
		        Query query = session.createQuery(hql);
		        query.setParameter("estado","INACTIVO");
		        query.setParameter("id",catalogo.getId());
		        query.executeUpdate();
		        
				resultado.setMensaje("El registro se ha eliminado con éxito");
			}
			if (operacion == "Crear"){
				Query query = session.createQuery("select count(*) from Catalogo where idTipo  = :idTipoCatalogo and estado = 'ACTIVO'");
				query.setParameter("idTipoCatalogo", catalogo.getIdtipo().getId());
				int nuevoIdNegocio = Integer.parseInt( query.uniqueResult().toString()) +1;
				
				 query = session.createQuery("select max(id) from Catalogo");
				BigDecimal nuevoId = BigDecimal.valueOf(Double.parseDouble( query.uniqueResult().toString())+1);
				
				
				catalogo.setId(nuevoId);
				catalogo.setCodigonegocio(String.valueOf(nuevoIdNegocio));
				catalogo.setEstado("ACTIVO");
				
				
				session.save(catalogo);
				resultado.setMensaje("El registro se ha creado con éxito");
			}
			session.getTransaction().commit();
		
			resultado.setEstado(true);
			
		}catch(HibernateException e){
			throw(e);
		}
		
		return resultado;
	}
	@SuppressWarnings("unused")
	private Catalogo ConsultaCatalogoPorId(BigDecimal idCatalogo){
		Catalogo catalogo = null;
		
	
        
        return catalogo;
        
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Tipocatalogo> ConsultarTipoCatalogo() throws HibernateException {
		List<Tipocatalogo> lista = null;
		try{
			Session session=HibernateUtil.getSessionFactory().openSession();

			session.beginTransaction();
			Query query = session.createQuery("from Tipocatalogo where estado = 'ACTIVO'");
	         
	        lista = query.list(); 
	            
			session.getTransaction().commit();
			
			return lista;
		}catch(HibernateException e){
			throw(e);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Region> ConsultarRegiones() throws HibernateException {
		List<Region> lista = null;
		try{
			Session session=HibernateUtil.getSessionFactory().openSession();

			session.beginTransaction();
			Query query = session.createQuery("from Region where estado = 'ACTIVO'");
	         
	        lista = query.list(); 
	            
			session.getTransaction().commit();
			
			return lista;
		}catch(HibernateException e){
			throw(e);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Provincia> ConsultarProvincias(BigDecimal idRegion)
			throws HibernateException {
		List<Provincia> lista = null;
		try{
			Session session=HibernateUtil.getSessionFactory().openSession();

			session.beginTransaction();
			Query query = session.createQuery("from Provincia as p where p.estado = 'ACTIVO' and p.idregion.id =:idregion");
			query.setParameter("idregion", idRegion);
	         
	        lista = query.list(); 
	            
			session.getTransaction().commit();
			
			return lista;
		}catch(HibernateException e){
			throw(e);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Canton> ConsultarCantones(BigDecimal idProvincia)
			throws HibernateException {
		List<Canton> lista = null;
		try{
			Session session=HibernateUtil.getSessionFactory().openSession();

			session.beginTransaction();
			Query query = session.createQuery("from Canton as c where c.estado = 'ACTIVO' and c.idprovincia.id =:idprovincia");
			query.setParameter("idprovincia", idProvincia);
	         
	        lista = query.list(); 
	            
			session.getTransaction().commit();
			
			return lista;
		}catch(HibernateException e){
			throw(e);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Canton> ConsultarCantonesTodos() throws HibernateException {
		List<Canton> lista = null;
		try{
			Session session=HibernateUtil.getSessionFactory().openSession();

			session.beginTransaction();
			Query query = session.createQuery("from Canton where estado = 'ACTIVO'");
	         
	        lista = query.list(); 
	            
			session.getTransaction().commit();
			
			return lista;
		}catch(HibernateException e){
			throw(e);
		}
	}
	

}
